package logic;

import java.sql.SQLException;
import java.util.List;

import ui.graphical.UIHelper;

import logic.rule.PlanningRules;

import dao.ContinentDAO;
import dao.DAOFacade;
import dao.DeelnemerDAO;
import dao.KortingDAO;
import dao.LandDAO;
import dao.PersoonDAO;
import dao.PlanningDAO;
import dao.ReisDAO;
import dao.ReserveringDAO;
import domain.Continent;
import domain.Deelnemer;
import domain.Korting;
import domain.Land;
import domain.Persoon;
import domain.Planning;
import domain.Reis;
import domain.Reservering;

public class Logic {
	private ContinentDAO continentdao;
	private DeelnemerDAO deelnemerdao;
	private KortingDAO kortingdao;
	private LandDAO landdao;
	private PersoonDAO persoondao;
	private PlanningDAO planningdao;
	private ReisDAO reisdao;
	private ReserveringDAO reserveringdao;
	
	public Logic(DAOFacade daofacade) {
		continentdao = daofacade.getContinentDAO();
		deelnemerdao = daofacade.getDeelnemerDAO();
		kortingdao = daofacade.getKortingDAO();
		landdao = daofacade.getLandDAO();
		persoondao = daofacade.getPersoonDAO();
		planningdao = daofacade.getPlanningDAO();
		reisdao = daofacade.getReisDAO();
		reserveringdao = daofacade.getReserveringDAO();
	}
	
	public List<Continent> getContinenten() {
		return continentdao.findAll();
	}
	
	public List<Land> getLanden() {
		return landdao.findAll();
	}
	public List<Reis> zoekReizen(String zoek) {
		return reisdao.findByReistype(zoek);
	}
	
	public void verwijderReis(Reis reis) throws SQLException {
		reisdao.delete(reis);
	}
	
	public void saveReis(Reis reis) throws SQLException {
		reisdao.save(reis);
	}
	public List<Persoon> getGidsen() {
		return zoekPersonen("G");
	}
	public List<Persoon> getDeelnemers() {
		List<Persoon> personen = zoekPersonen("D");
		personen.addAll(zoekPersonen(""));
		return personen;
	}
	public void verwijderPlanning(Planning planning) throws SQLException {
		planningdao.delete(planning);
	}
	
	public void checkGidsBezet(Planning nieuwePlanning) throws SQLException {
		Planning planning = planningdao.checkGidsBezet(nieuwePlanning);
		if(planning!=null) {
			throw new SQLException(planning.getGids().getVoornaam()+" "+planning.getGids().getAchternaam()+
					" is al ingepland voor "+planning.getReis().getReistype()+" van "+
					UIHelper.date2string(planning.getStartdatum())+" t/m "+UIHelper.date2string(planning.getEinddatum())+".");
		}
	}
	public void savePlanning(Planning planning) throws SQLException {
		PlanningRules.checkPlanning(this, planning);
		planningdao.save(planning);
	}
	public List<Korting> getKortingen() {
		return kortingdao.findAll();
	}
	public void verwijderKorting(Korting korting) throws SQLException {
		kortingdao.delete(korting);
	}
	public void saveKorting(Korting korting) throws SQLException {
		kortingdao.save(korting);
	}
	public Korting getKortingByMinDeelnemers(int min_deelnemers) {
		return kortingdao.getKortingByMinDeelnemers(min_deelnemers);
	}
	public Korting getKortingByMaxDeelnemers(int max_deelnemers) {
		return kortingdao.getKortingByMaxDeelnemers(max_deelnemers);
	}
	public Korting getKorting(int deelnemers) {
		return kortingdao.getKorting(deelnemers);
	}
	
	public void savePersoon(Persoon persoon) throws SQLException {
		persoondao.save(persoon);
	}
	public List<Persoon> zoekPersonen(String type,String zoek) {
		return persoondao.findByName(type,zoek);
	}
	
	public List<Persoon> zoekPersonen(String type) {
		return persoondao.findByType(type);
	}
	
	public void verwijderPersoon(Persoon persoon) throws SQLException {
		persoondao.delete(persoon);
	}
	
	public List<Reservering> zoekReserveringen(String zoek) {
		return reserveringdao.findByName(zoek);
	}
	
	public void saveReservering(Reservering reservering) throws SQLException {
		reserveringdao.save(reservering);
	}
	
	public void saveDeelnemer(Deelnemer deelnemer) throws SQLException {
		deelnemerdao.save(deelnemer);
	}
	
}
